home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / icon tools / picticon / source / picticon.e < prev    next >
Text File  |  1996-04-07  |  47KB  |  1,686 lines

  1. MODULE 'exec/nodes','exec/ports','exec/types','exec/memory',
  2.        'intuition/intuition','intuition/screens','intuition/gadgetclass',
  3.        'intuition/screens','dos/dos','dos/dosextens','gadtools',
  4.        'libraries/gadtools','graphics/rastport','graphics/gfx','graphics/text',
  5.        'graphics/view','graphics/gfxbase','workbench/workbench',
  6.        'workbench/startup','wb','icon','graphics/clip','diskfont',
  7.        'libraries/diskfont','libraries/iffparse','iffparse','Asl','libraries/Asl',
  8.        'datatypes/datatypes','datatypes/datatypesclass','datatypes/pictureclass',
  9.        'utility/hooks','intuition/classes','intuition/classusr',
  10.        'libraries/locale',
  11.              'mathffp','dos/dosasl',
  12.        'datatypes','layers','keymap','devices/inputevent','mathtrans','locale'
  13. MODULE 'newicon','libraries/newicon'
  14.  
  15. MODULE    'whatis','libraries/whatisbase'
  16.  
  17. MODULE    '*doloaddt'
  18.  
  19. /* options:
  20.  
  21.   MAXIWIDTH=x       ;buffer size width
  22.   MAXIHEIGHT=x      ;buffer size height
  23.   APPICON=$         ;name of App-icon image
  24.   TEMPLATE_ICON=$   ;name of icon to modify (tooltypes, positions)
  25.   BACKGROUND_ICON=$ ;Name of background icon.
  26.   CHUNKYMODE=B      ;save icon with ReadPixels, not bitmap->image.
  27.   FORCE_EIGHT=B     ;If YES then eight planes are saved.
  28.   PIC_X_POS=x       ;Offset for image.
  29.   PIC_Y_POS=x       ;Offset for image.
  30.   PIC_X_SIZE=x      ;Real size of image (not always, but at least < than)
  31.   PIC_Y_SIZE=x      ;Real size of image.
  32.   CENTER=B          ;Center icon? Only valid with PIC_X_SIZE/PIC_Y_SIZE
  33.   SHOWSIZE_X=x      ;X pos for size coords
  34.   SHOWSIZE_Y=x      ;Y pos for size coords
  35.   LOWPRI=B          ;If= "yes" then run at priority -1
  36.   FREE_ICON_POS=B   ;Set icon to "unsnapshot"
  37.   HIGHPEN=x         ;topmost pen to use
  38.   SHOWSIZE_OUTLINE=B;If yes, then outline the size, otherwise, shadow it
  39.   SHOWSIZE_NORMAL=B ;If yes, then no shadow, no outline.
  40.   SHOWSIZE_TALL=B   ;If yes, then font is 8 high, not 6.
  41.   QUIET=B           ;If yes then surpress ALL output.
  42.   APP_X_POS=x       ;x pos of appicon
  43.   APP_Y_POS=y       ;y pos of appicon
  44.     DITHER=B                    ;if YES then do dithering
  45.  
  46.                          ;      The following are EXPERT tooltypes, only...
  47.     TWOPASS=B                    ;if YES and dithering on, then do left to right, right to left passes.
  48.     D_THRESHOLD=x            ;a pos value for the minimum addition value (dithering)  (EXPERT)
  49.     D_IGNORE=x                ;a pos value.  If error<x then igrnore error in dithering.  (EXPERT)
  50.     D_LIMIT=x                    ;a pos value for the maximum addition value (dithering)  (EXPERT)
  51.     D_TYPE=x                    ;0 is default    3/8 , 0/0 , 3/8 , 1/4            x  1st value  (x=from here)
  52.                                         ;1 is FS?        7/16, 3/16, 5/16, 1/16      2nd 3rd 4th values
  53.                                         ;2 is alternate  1/2 , 0/0,  1/2,  0/0
  54.                                         ;3 is crosshatch 0/0 , 1/2,  0/0,  1/2             (all EXPERT tooltypes!)
  55.                     ;4 is linear     1/1 , 0/0,  0/0,  0/0
  56.                                         ;5 is equal      1/4 , 1/4,  1/4,  1/4
  57. */
  58.  
  59. ENUM E_NONE,L_OK,
  60.   L_E_GENERAL,L_E_FILE,L_E_NOFILE,L_E_BADICON,L_E_NOWRITEICON,L_E_CLIP,
  61.   L_E_DATATYPE,L_E_NOPICTURE,L_E_GADGET,
  62.   L_EF_LIBRARY,L_EF_FATAL,L_EF_PUBSCREEN,L_EF_CHIPBUFFER,L_EF_VISUAL,L_EF_MENUS,
  63.   L_EF_MSGPORT,L_EF_WINDOW,L_EF_MEMORY,L_TEXTTITLE,
  64.   L_PICTURE,L_FILEOF,L_LOADING,L_SCALING,L_REMAPPING,L_SAVING,L_PERCENT,
  65.   L_TITLE,L_BODY,L_BUTTONS,L_RENDERING,L_PERCENT2,L_ENDS
  66.  
  67. ENUM MODE_CLI,MODE_WB,MODE_QUIET,MODE_APP
  68. ENUM TEXT_NORMAL,TEXT_SHADOW,TEXT_OUTLINE
  69.   OBJECT mybitmapstruct
  70.     bytesperrow:INT;rows:INT;flags:CHAR;depth:CHAR;pad:INT
  71.     plane1:LONG;plane2:LONG;plane3:LONG;plane4:LONG
  72.     plane5:LONG;plane6:LONG;plane7:LONG;plane8:LONG
  73.   ENDOBJECT
  74.  
  75. DEF dumstr[500]:STRING
  76. DEF texttype=TEXT_SHADOW,tallfont=FALSE
  77. DEF iff:PTR TO iffhandle,ierror
  78. DEF sp=NIL:PTR TO storedproperty
  79. DEF freeme=FALSE
  80. DEF curfile=1,totfile=1
  81. DEF screenfont=NIL:PTR TO textfont
  82. DEF window=NIL:PTR TO window,rast,drawinfo,fgx,fgy,fgw,fgh
  83. DEF showflag=FALSE,showx=0,showy=0,bitsizex,bitsizey,sizestr[50]:STRING
  84. DEF black,white,writecolors=2
  85. DEF posx=0,posy=0,sizex=0,sizey=0,centerflag=FALSE,posflag=FALSE
  86. DEF noappitem=FALSE
  87. DEF minimumx,minimumy
  88. DEF quietflag=FALSE,goodload
  89. DEF requestsizex,requestsizey,highestcolor
  90. DEF k[15]:LIST
  91. DEF redt[256]:LIST,grnt[256]:LIST,blut[256]:LIST
  92. DEF ditz,dang,dumb,body
  93. DEF osversion,quitter,newicon=FALSE
  94. DEF abort
  95. DEF aspectx=1,aspecty=1,useaspect=TRUE
  96. DEF radian,pointfive
  97. DEF catalog,sl[500]:LIST
  98. DEF iconianheader[80]:STRING
  99. DEF scratch,ret,dummy
  100. DEF appimagedata,diskobj=NIL:PTR TO diskobject,newdiskobj=NIL:PTR TO newdiskobject
  101. DEF progname[500]:STRING,sleepername[500]:STRING,templatename[500]:STRING
  102. DEF backname[500]:STRING
  103. DEF gaugestr[100]:STRING
  104. DEF toolobject=NIL:PTR TO diskobject
  105. DEF usewhatis=TRUE
  106. DEF chunkyflag=FALSE,force8=FALSE,first4=-1
  107. DEF maxiwidth=128,maxiheight=100,maxiw=127,maxih=99
  108. DEF filename[500]:STRING
  109. DEF mode=MODE_CLI
  110. DEF scr=NIL:PTR TO screen,viewport:PTR TO viewport
  111. DEF bitmap:PTR TO bitmap,depth,colormap=0,newcolormap=0,cmbuf=0
  112. DEF currast=NIL:PTR TO rastport,curbitmap=NIL:PTR TO bitmap
  113. DEF appname[500]:STRING
  114. DEF visual=NIL,winx=-1,winy=-1
  115. DEF oldpx=-1
  116. DEF appx=-1,appy=-1
  117. DEF dither=TRUE
  118. DEF twopass=FALSE
  119. DEF rawdata=0
  120. DEF div1=3,div2=0,div3=3,div4=1,rem1=8,rem2=1,rem3=8,rem4=4
  121. DEF thres=2,ignore=16,lim=255,typ=0
  122. DEF iinfo=0:PTR TO imageinfo
  123.  
  124. PROC main()
  125.     NEW iinfo
  126.   openlibs()
  127.   radian:=sp_div_tf_tf_f(10000,572958)
  128.   pointfive:=sp_div_tf_tf_f(10,5)
  129.   StrCopy(iconianheader,'Picticon 0.96',ALL)
  130.   loadwinpos()
  131.   handwb()
  132.   savewinpos()
  133.   leave(0)
  134. ENDPROC
  135.  
  136. versionstring:
  137. CHAR '\0$VER: picticon 0.96 (4.12.94)\0'
  138. CHAR 0,0,0,0
  139.  
  140. PROC setraw(x,y,r,g,b)
  141.   IF rawdata
  142.     PutLong(rawdata+(limit(x,0,maxiwidth)*12)+(limit(y,0,1)*12*maxiwidth),r)
  143.     PutLong(rawdata+(limit(x,0,maxiwidth)*12)+4+(limit(y,0,1)*12*maxiwidth),g)
  144.     PutLong(rawdata+(limit(x,0,maxiwidth)*12)+8+(limit(y,0,1)*12*maxiwidth),b)
  145.   ENDIF
  146. ENDPROC
  147.  
  148. PROC rawred(x,y)
  149.   RETURN Long(rawdata+(x*12)+(y*12*maxiwidth))
  150. ENDPROC
  151.  
  152. PROC rawgrn(x,y)
  153.   RETURN Long(rawdata+4+(x*12)+(y*12*maxiwidth))
  154. ENDPROC
  155.  
  156. PROC rawblu(x,y)
  157.   RETURN Long(rawdata+8+(x*12)+(y*12*maxiwidth))
  158. ENDPROC
  159.  
  160. PROC processicon() HANDLE
  161.   DEF gadget:PTR TO gadget
  162.   DEF backobj=NIL:PTR TO diskobject
  163.   DEF screenattr:PTR TO textattr,sfonth=8
  164.   DEF heystring[500]:STRING,file[500]:STRING
  165.   DEF iiii,tttt,oldshowx,loo,gc1,gc2
  166.     DEF inw,inh,lock
  167.     DEF imsg:PTR TO intuimessage
  168.   oldshowx:=showx
  169.   window:=NIL
  170.   IF StrLen(filename)<1 THEN Raise(E_NONE)
  171.   IF ((scr:=LockPubScreen('Workbench'))=0) THEN Raise(L_EF_PUBSCREEN)
  172.   visual:=GetVisualInfoA(scr,NIL)
  173.   viewport:=scr.viewport
  174.   colormap:=viewport.colormap
  175.   bitmap:=scr.bitmap
  176.   depth:=bitmap.depth
  177.     IF (newicon)
  178.         newcolormap:=GetColorMap(256)
  179.         cmbuf:=New(32)
  180.         FOR loo:=0 TO 255
  181.             gc1:=loo AND (Shl(1,depth)-1)
  182.             GetRGB32(colormap,gc1,1,cmbuf)
  183.             SetRGB32CM(newcolormap,loo,Long(cmbuf),Long(cmbuf+4),Long(cmbuf+8))            
  184.         ENDFOR
  185.         colormap:=newcolormap
  186.         Dispose(cmbuf)
  187.     ENDIF
  188.   IF (curbitmap:=myallocbitmap(maxiwidth,maxiheight,8,BMF_CLEAR OR BMF_STANDARD,NIL))=NIL THEN Raise(L_EF_CHIPBUFFER)
  189.  
  190.   IF (currast:=New(SIZEOF rastport))=NIL THEN Raise(L_EF_FATAL)
  191.   InitRastPort(currast);currast.bitmap:=curbitmap
  192.  
  193.   screenattr:=scr.font
  194.   sfonth:=screenattr.ysize
  195.  
  196.   IF ((mode<>MODE_QUIET) AND (mode<>MODE_CLI))
  197.         inw:=bigger(300,12*StrLen(FilePart(filename)))
  198.         inh:=sfonth*3+20-((totfile>1)*(sfonth+4))
  199.     IF winx=-1 THEN winx:=(((scr.width-300)/2))
  200.     IF winy=-1 THEN winy:=(((scr.height-(sfonth*2+16))/2))
  201.     window:=OpenWindowTagList(0,[WA_LEFT,winx,
  202.       WA_TOP,winy,
  203.       WA_INNERWIDTH,inw,
  204.       WA_INNERHEIGHT,inh,
  205.       WA_FLAGS,WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR WFLG_CLOSEGADGET,
  206.             WA_IDCMP,IDCMP_CLOSEWINDOW,
  207.       WA_TITLE,sl[L_TEXTTITLE],
  208.       WA_CUSTOMSCREEN,scr,
  209.       WA_AUTOADJUST,TRUE,
  210.       NIL,NIL])
  211.     rast:=window.rport
  212.     screenfont:=OpenFont(scr.font)
  213.     IF screenfont THEN SetFont(rast,screenfont)
  214.     fgx:=4+window.borderleft
  215.     fgw:=window.width-(8+window.borderleft+window.borderright)
  216.     fgh:=window.height-(window.bordertop+4+window.borderbottom)-(sfonth*2)-8+((totfile>1)*(sfonth+4))
  217.     fgy:=window.height-(sfonth*2)-18
  218.  
  219.  
  220.         SetAPen(rast,2)
  221.         shadowtext(rast,fgx,fgy+6+fgh+screenfont.baseline,'0%',2)
  222.         shadowtext(rast,fgx+fgw-TextLength(rast,'100%',4),fgy+fgh+6+screenfont.baseline,'100%',4)
  223.         shadowtext(rast,fgx+(fgw/2)-(TextLength(rast,'50%',3)/2),fgy+fgh+6+screenfont.baseline,'50%',3)
  224.         shadowtext(rast,fgx+(fgw/4)-(TextLength(rast,'25%',3)/2),fgy+fgh+6+screenfont.baseline,'25%',3)
  225.         shadowtext(rast,fgx+(fgw*3/4)-(TextLength(rast,'75%',3)/2),fgy+fgh+6+screenfont.baseline,'75%',3)
  226.  
  227.     StringF(heystring,sl[L_PICTURE],FilePart(filename))
  228.     SetAPen(rast,1)
  229.     Move(rast,fgx+(fgw/2)-(TextLength(rast,heystring,StrLen(heystring))/2),window.bordertop+3+screenfont.baseline)
  230.     Text(rast,heystring,StrLen(heystring))
  231.  
  232.         shadowline(rast,fgx,fgy+1+fgh,fgx,fgy+4+fgh)
  233.         shadowline(rast,fgx+fgw-2,fgy+1+fgh,fgx+fgw-2,fgy+4+fgh)
  234.         shadowline(rast,fgx+(fgw/2),fgy+1+fgh,fgx+(fgw/2),fgy+4+fgh)
  235.         shadowline(rast,fgx+(fgw/4),fgy+1+fgh,fgx+(fgw/4),fgy+4+fgh)
  236.         shadowline(rast,fgx+(fgw*3/4),fgy+1+fgh,fgx+(fgw*3/4),fgy+4+fgh)
  237.  
  238.     IF totfile>1
  239.       StringF(heystring,sl[L_FILEOF],curfile,totfile)
  240.       Move(rast,fgx+(fgw/2)-(TextLength(rast,heystring,StrLen(heystring))/2),window.bordertop+5+screenfont.baseline+screenfont.ysize)
  241.       Text(rast,heystring,StrLen(heystring))
  242.     ENDIF
  243.     ELSE
  244.         IF (mode=MODE_CLI)
  245.             WriteF('\n"\s" - ',filename)
  246.         ENDIF
  247.   ENDIF
  248.  
  249.     diskobj:=0;newdiskobj:=0
  250.     IF StrLen(templatename)
  251.         IF (newicon)
  252.             newdiskobj:=GetNewDiskObject(templatename)
  253.             diskobj:=newdiskobj.ndo_stdobject
  254.         ELSE
  255.             diskobj:=GetDiskObject(templatename)
  256.         ENDIF
  257.     ENDIF
  258.     
  259.     IF (diskobj=0)
  260.         IF (newicon)
  261.             newdiskobj:=GetNewDiskObject(filename)
  262.             diskobj:=newdiskobj.ndo_stdobject
  263.         ELSE
  264.             diskobj:=GetDiskObject(filename)
  265.         ENDIF
  266.     ENDIF
  267.     IF ((usewhatis<>0) AND (diskobj=0))
  268.       StrCopy(file,'Icons:',ALL)
  269.         IF (lock:=Lock(filename,ACCESS_READ))
  270.             AddPart(file,GetIconName(WhatIs(filename,[WI_DEEP,DEEPTYPE,NIL,NIL]:LONG)),490)
  271.             UnLock(lock)
  272.         ENDIF
  273.         IF (newicon)
  274.             newdiskobj:=GetNewDiskObject(file)
  275.             diskobj:=newdiskobj.ndo_stdobject
  276.         ELSE
  277.             diskobj:=GetDiskObject(file)
  278.         ENDIF
  279.     ENDIF
  280.     IF (diskobj=0)
  281.         IF (newicon)
  282.             newdiskobj:=GetNewDiskObject('ENV:sys/def_picture')
  283.             diskobj:=newdiskobj.ndo_stdobject
  284.         ELSE
  285.             diskobj:=GetDiskObject('ENV:sys/def_picture')            -> Next to last resort.
  286.         ENDIF
  287.     ENDIF
  288.     IF (diskobj=0) THEN diskobj:=GetDefDiskObject(WBPROJECT)                            -> Last resort.
  289.  
  290.   SetAPen(currast,0)
  291.   SetBPen(currast,0)
  292.   RectFill(currast,0,0,maxiw,maxih)
  293.   IF (backobj:=GetDiskObject(backname))
  294.         IF (newicon)
  295.             IF (mode=MODE_CLI)
  296.                 WriteF('Background template ignored.\n')
  297.             ENDIF
  298.         ELSE
  299.         gadget:=backobj.gadget
  300.         copyimagerast(currast,gadget.gadgetrender)
  301.         ENDIF
  302.   ENDIF
  303.     goodload:=FALSE
  304.   displaypercent(1,5000)
  305.     StrCopy(gaugestr,{controlstring},ALL)
  306.     StrAdd(gaugestr,sl[L_PERCENT2],ALL)
  307.   displaymessage(sl[L_LOADING],TRUE)
  308.     IF (abort=FALSE)
  309.       IF (doloaddt(filename,currast,colormap,posx,posy,sizex,sizey,[DLDT_CENTER,centerflag,
  310.             DLDT_INTEGERSCALE,FALSE,
  311.             DLDT_DITHER,dither,
  312.             DLDT_REMAP,TRUE,
  313.             DLDT_ASPECTX,aspectx,
  314.             DLDT_ASPECTY,aspecty,
  315.             DLDT_SCALE,TRUE,
  316.             DLDT_USEASPECT,useaspect,
  317.             DLDT_ENLARGE,FALSE,
  318.             DLDT_CLEAR,FALSE,
  319.             DLDT_GAUGE,IF ((mode=MODE_WB) OR (mode=MODE_APP)) THEN [rast,scr,fgx+3,fgy+2,fgw-8,fgh-4]:gauge ELSE 0,
  320.             DLDT_CLIGAUGE,IF (mode=MODE_CLI) THEN gaugestr ELSE 0,
  321.             DLDT_INFO,iinfo,
  322.             DLDT_HIGHPEN,first4,
  323.             DLDT_FILLCMAP,newicon,
  324.             NIL,NIL])=0)
  325.             goodload:=TRUE
  326.         ENDIF
  327.     ELSE
  328.       displaymessage(sl[L_E_DATATYPE],TRUE);Delay(30)
  329.     ENDIF
  330.  
  331.     bitsizex:=iinfo.source_w
  332.     bitsizey:=iinfo.source_h
  333.     black:=iinfo.blackpen
  334.     white:=iinfo.whitepen
  335.     writecolors:=limit((Shl(1,iinfo.depth)*2),1,255)
  336.   IF showflag
  337.     StringF(sizestr,'\dx\d',bitsizex,bitsizey)
  338.     IF showx=-1 THEN showx:=posx+(sizex/2)-((StrLen(sizestr)*6)/2)
  339.     IF showy=-1 THEN showy:=1
  340.  
  341.     IF texttype=TEXT_OUTLINE
  342.       FOR tttt:=-1 TO 1
  343.         FOR iiii:=-1 TO 1
  344.           showpicsize(showx+iiii,showy+tttt,black,sizestr)
  345.         ENDFOR
  346.       ENDFOR
  347.     ENDIF
  348.     IF texttype=TEXT_SHADOW THEN showpicsize(showx+1,showy+1,black,sizestr)
  349.     showpicsize(showx,showy,white,sizestr)
  350.   ENDIF
  351.   showx:=oldshowx
  352.   IF goodload
  353.         IF newicon
  354.             savenewicon()
  355.         ELSE
  356.         saveicon()
  357.         ENDIF
  358.   ENDIF
  359.   Raise(E_NONE)
  360. EXCEPT
  361.   IF visual THEN FreeVisualInfo(visual);visual:=NIL
  362.   IF scr THEN UnlockPubScreen(0,scr);scr:=NIL
  363.   IF curbitmap THEN myfreebitmap(curbitmap);curbitmap:=NIL
  364.   IF currast THEN Dispose(currast);currast:=NIL
  365.     IF newicon
  366.         IF newdiskobj THEN FreeNewDiskObject(newdiskobj);newdiskobj:=NIL;diskobj:=NIL
  367.     ELSE
  368.       IF diskobj THEN FreeDiskObject(diskobj);diskobj:=NIL
  369.     ENDIF
  370.   IF backobj THEN FreeDiskObject(backobj);backobj:=NIL
  371.     IF (newicon)
  372.         IF (newcolormap)
  373.             FreeColorMap(newcolormap)
  374.         ENDIF
  375.     ENDIF
  376.   IF window
  377.         WHILE (imsg:=GetMsg(window.userport))
  378.             IF (imsg.class=IDCMP_CLOSEWINDOW)
  379.                 abort:=TRUE
  380.             ENDIF
  381.             ReplyMsg(imsg);imsg:=0
  382.         ENDWHILE
  383.     winx:=window.leftedge;winy:=window.topedge
  384.     CloseWindow(window);window:=NIL
  385.       savewinpos()
  386.   ENDIF
  387.   IF screenfont THEN CloseFont(screenfont);screenfont:=NIL
  388.   handleexception(exception)
  389. ENDPROC
  390.  
  391. PROC shadowline(rast,x1,y1,x2,y2)
  392.     DEF drawinfo=NIL:PTR TO drawinfo
  393.     IF ((scr=0) OR (rast=0)) THEN RETURN
  394.     IF (drawinfo:=GetScreenDrawInfo(scr))
  395.         SetAPen(rast,Int(drawinfo.pens+(SHINEPEN*2)))
  396.         Move(rast,x1+1,y1+1)
  397.         Draw(rast,x2+1,y2+1)
  398.         SetAPen(rast,Int(drawinfo.pens+(SHADOWPEN*2)))
  399.         Move(rast,x1,y1)
  400.         Draw(rast,x2,y2)
  401.         FreeScreenDrawInfo(scr,drawinfo)
  402.     ENDIF
  403. ENDPROC
  404.  
  405. PROC shadowtext(rast,x1,y1,x2,y2)
  406.     DEF drawinfo=NIL:PTR TO drawinfo
  407.     IF ((scr=0) OR (rast=0)) THEN RETURN
  408.     IF (drawinfo:=GetScreenDrawInfo(scr))
  409.         SetDrMd(rast,RP_JAM1)
  410. /*        SetAPen(rast,Int(drawinfo.pens+(SHINEPEN*2)))
  411.         Move(rast,x1+1,y1+1)
  412.         Text(rast,x2,y2)*/
  413.         SetAPen(rast,Int(drawinfo.pens+(SHADOWPEN*2)))
  414.         Move(rast,x1,y1)
  415.         Text(rast,x2,y2)
  416.         FreeScreenDrawInfo(scr,drawinfo)
  417.         SetDrMd(rast,RP_JAM2)
  418.     ENDIF
  419. ENDPROC
  420.  
  421. PROC saveicon() HANDLE
  422.   DEF ire
  423.   DEF mydiskobj=NIL:PTR TO diskobject
  424.  
  425.   mydiskobj:=diskobj
  426.  
  427.   IF mode=MODE_CLI THEN WriteF('\n')
  428.   displaymessage(sl[L_SAVING],TRUE)
  429.   creatediskobj(mydiskobj,currast)
  430.  
  431.   IF (ire:=PutDiskObject(filename,mydiskobj))=NIL THEN Raise(L_E_NOWRITEICON)
  432.  
  433.   Raise(E_NONE)
  434. EXCEPT
  435.   restorediskobj(mydiskobj)
  436.   handleexception(exception)
  437. ENDPROC
  438.  
  439. oldimage:
  440.     INT 0,0,1,1,1
  441. fillim:
  442.     LONG 0    ->FILL ME
  443.     CHAR 1,0
  444.     LONG 0
  445.  
  446. image:
  447.     LONG $FFFF
  448.  
  449. PROC savenewicon() HANDLE
  450.   DEF ire,i,x,y
  451.     DEF chunk=NIL:PTR TO chunkyimage,ctab=NIL,ci=NIL
  452.   DEF mydiskobj=NIL:PTR TO diskobject
  453.     DEF myni=NIL:PTR TO newdiskobject
  454.     DEF buffer=NIL
  455.     DEF file[500]:STRING
  456.  
  457.     NEW chunk,myni
  458.     ctab:=New(260*3)
  459.     ci:=New(maxiwidth*maxiheight*2)
  460.     buffer:=New(20)
  461.  
  462.   mydiskobj:=diskobj
  463.  
  464.   IF mode=MODE_CLI THEN WriteF('\n')
  465.   displaymessage(sl[L_SAVING],TRUE)
  466.   creatediskobj(mydiskobj,currast)
  467.  
  468.     PutLong({fillim},{image})
  469.     mydiskobj.gadget::gadget.width:=1
  470.     mydiskobj.gadget::gadget.height:=1
  471.  
  472.     mydiskobj.gadget::gadget.gadgetrender:={oldimage}
  473.  
  474.     myni.ndo_stdobject:=mydiskobj
  475.     myni.ndo_normalimage:=chunk
  476.  
  477.     chunk.width:=requestsizex
  478.     chunk.height:=requestsizey-1
  479.     chunk.numcolors:=writecolors+1
  480.     chunk.flags:=0                                -> Color 0 in NOT transparent!
  481.     chunk.palette:=ctab
  482.     chunk.chunkydata:=ci
  483.  
  484.     FOR i:=0 TO writecolors
  485.         GetRGB32(newcolormap,i,1,buffer)
  486.         PutChar(ctab+(i*3)+0,Char(buffer))
  487.         PutChar(ctab+(i*3)+1,Char(buffer+4))
  488.         PutChar(ctab+(i*3)+2,Char(buffer+8))
  489.     ENDFOR
  490.  
  491.     FOR y:=0 TO requestsizey-1
  492.         FOR x:=0 TO requestsizex-1
  493.             PutChar(ci+(y*requestsizex)+x,ReadPixel(currast,x,y))
  494.         ENDFOR
  495.     ENDFOR
  496.  
  497.     StrCopy(file,filename,ALL)
  498.     StrAdd(file,'.info',ALL)
  499.     DeleteFile(file)
  500.     DeleteDiskObject(filename)
  501.   IF (ire:=PutNewDiskObject(filename,myni))=NIL THEN Raise(L_E_NOWRITEICON)
  502.   Raise(E_NONE)
  503. EXCEPT
  504.   restorediskobj(mydiskobj)
  505.   handleexception(exception)
  506.     Dispose(ctab);Dispose(ci);Dispose(buffer)
  507.     END chunk,myni
  508. ENDPROC
  509.  
  510. PROC displaypercent(done,max)
  511.   IF (mode<>MODE_CLI)
  512.     IF (((mode=MODE_WB) OR (mode=MODE_APP)) AND (window) AND (rast))
  513.       SetAPen(rast,3)
  514.       IF visual
  515.         DrawBevelBoxA(rast,fgx,fgy,fgw,fgh,[GT_VISUALINFO,visual,
  516.           GTBB_RECESSED,TRUE,GTBB_FRAMETYPE,BBFT_BUTTON,NIL,NIL])
  517.       ENDIF
  518.     ENDIF
  519.   ENDIF
  520. ENDPROC
  521.  
  522. PROC displaymessage(msg,flag)
  523.   IF mode=MODE_CLI
  524.     WriteF('\s\n',msg)
  525.   ELSE
  526.     IF (((mode=MODE_WB) OR (mode=MODE_APP)) AND (window) AND (rast))
  527.       IF flag<>0
  528.         SetAPen(rast,0)
  529.         RectFill(rast,fgx+2,fgy+1,fgx+fgw-4,fgy+fgh-2)
  530.       ELSE
  531.         SetDrMd(rast,RP_JAM1)
  532.       ENDIF
  533.       Move(rast,fgx+(fgw/2)-(TextLength(rast,msg,StrLen(msg))/2),fgy+fgh-(screenfont.ysize-screenfont.baseline)-3)
  534.       SetAPen(rast,1)
  535.       Text(rast,msg,StrLen(msg))
  536.       SetDrMd(rast,RP_JAM2)
  537.       IF visual
  538.         DrawBevelBoxA(rast,fgx,fgy,fgw,fgh,[GT_VISUALINFO,visual,
  539.           GTBB_RECESSED,TRUE,GTBB_FRAMETYPE,BBFT_BUTTON,NIL,NIL])
  540.       ENDIF
  541.     ENDIF
  542.   ENDIF
  543. ENDPROC
  544.  
  545. PROC showpicsize(x,y,p,s)
  546.   DEF ii,tt,uu,mm,charptr,xptr,ysize=6
  547.   charptr:={chardata}
  548.   xptr:={xdata}
  549.   IF tallfont
  550.     ysize:=8
  551.     charptr:={chardatal}
  552.     xptr:={xdatal}
  553.   ENDIF
  554.   SetAPen(currast,p)
  555.   FOR ii:=0 TO (StrLen(s)-1)
  556.     mm:=Char(s+ii)
  557.     FOR tt:=0 TO (ysize-1)
  558.       FOR uu:=0 TO 5
  559.         IF mm<>"x"
  560.           IF Char(charptr+uu+(tt*8)+((mm-48)*(8*ysize)))="x"
  561.             WritePixel(currast,smaller(bigger(x+uu+(ii*6),0),maxiw),smaller(bigger(y+tt,0),maxih))
  562.           ENDIF
  563.         ELSE
  564.           IF Char(xptr+uu+(tt*8))="x"
  565.             WritePixel(currast,smaller(bigger(x+uu+(ii*6),0),maxiw),smaller(bigger(y+tt,0),maxih))
  566.           ELSE
  567.           ENDIF
  568.         ENDIF
  569.       ENDFOR
  570.     ENDFOR
  571.   ENDFOR
  572.  
  573. ENDPROC
  574. PROC dosleep()
  575.   DEF sleepobject=NIL:PTR TO diskobject
  576.   DEF appobject=NIL:PTR TO diskobject
  577.   DEF appport=NIL:PTR TO mp
  578.   DEF appflag=NIL
  579.   DEF appicon,appitem=FALSE,newproj[250]:STRING
  580.   DEF lockname[250]:STRING,newlock=NIL
  581.   DEF amsg:PTR TO appmessage
  582.   DEF argptr:PTR TO wbarg
  583.   DEF lofal
  584.   DEF agadget:PTR TO gadget
  585.  
  586.   StrCopy(appname,sleepername,ALL)
  587.   IF (sleepobject:=GetDiskObject(appname))=NIL
  588.     IF (sleepobject:=GetDiskObject('ENV:SYS/def_appicon'))=NIL
  589.       StrCopy(appname,progname,ALL)
  590.       IF (sleepobject:=GetDiskObject(appname))=NIL
  591.         sleepobject:=GetDefDiskObject(WBTOOL)
  592.       ENDIF
  593.     ENDIF
  594.   ENDIF
  595.   IF sleepobject
  596.     sleepobject.type:=NIL
  597.     appobject:=sleepobject
  598.     agadget:=appobject.gadget
  599.     IF appx<0
  600.       agadget.leftedge:=NO_ICON_POSITION
  601.       appobject.currentx:=NO_ICON_POSITION
  602.     ELSE
  603.       agadget.leftedge:=appx
  604.       appobject.currentx:=appx
  605.     ENDIF
  606.     IF appy<0
  607.       agadget.topedge:=NO_ICON_POSITION
  608.       appobject.currenty:=NO_ICON_POSITION
  609.     ELSE
  610.       agadget.topedge:=appy
  611.       appobject.currenty:=appy
  612.     ENDIF
  613.  
  614.     IF (appport:=CreateMsgPort())
  615.       IF (appicon:=AddAppIconA(0,0,'Picticon',appport,0,appobject,NIL))<>NIL
  616.           IF (noappitem<>TRUE)
  617.               appitem:=AddAppMenuItemA(0,0,'Picticon',appport,0)
  618.           ENDIF
  619.           IF ((appitem) OR (noappitem=TRUE))
  620.             WHILE appflag=NIL
  621.               WaitPort(appport)
  622.               WHILE (amsg:=GetMsg(appport))<>NIL
  623.                 IF amsg.numargs=0
  624.                   IF EasyRequestArgs(0, [20, 0, sl[L_TITLE], sl[L_BODY],sl[L_BUTTONS]], 0, 0)
  625.                     appflag:=TRUE
  626.                   ENDIF
  627.                 ELSE
  628.                     abort:=FALSE
  629.                   argptr:=amsg.arglist
  630.                   curfile:=0;totfile:=amsg.numargs
  631.                   FOR lofal:=1 TO amsg.numargs
  632.                     StrCopy(newproj,argptr.name,ALL)
  633.                     newlock:=argptr.lock
  634.                     IF newlock
  635.                       NameFromLock(newlock,lockname,250)
  636.                       processname(filename,lockname,newproj)
  637.                       curfile:=curfile+1
  638.                       processicon()
  639.                     ENDIF
  640.                     argptr:=argptr+(SIZEOF wbarg)
  641.                                     IF CtrlC();lofal:=50000;ENDIF
  642.                                     IF (abort<>FALSE);lofal:=50000;ENDIF
  643.                   ENDFOR
  644.                 ENDIF
  645.                 ReplyMsg(amsg)
  646.               ENDWHILE
  647.             ENDWHILE
  648.             IF (appitem) THEN RemoveAppMenuItem(appitem);appitem:=0
  649.                 ENDIF
  650.            RemoveAppIcon(appicon)
  651.       ENDIF
  652.          WHILE (amsg:=GetMsg(appport))<>NIL
  653.            ReplyMsg(amsg)
  654.          ENDWHILE
  655.       DeleteMsgPort(appport)
  656.     ENDIF
  657.     IF sleepobject THEN FreeDiskObject(sleepobject);sleepobject:=NIL
  658.   ENDIF
  659. ENDPROC
  660.  
  661. yes:
  662.     CHAR    'YES',0
  663. no:
  664.     CHAR    'NO',0
  665. true:
  666.     CHAR    'TRUE',0
  667. false:
  668.     CHAR    'FALSE',0
  669.  
  670. PROC handwb()
  671.   DEF wb:PTR TO wbstartup,args:PTR TO wbarg
  672.   DEF argarray[40]:LIST,olddir,rdarg,s,wstr[500]:STRING
  673.   DEF locs,namesptr:PTR TO LONG,patternstr[500]:STRING
  674.     DEF fileinfo=NIL:PTR TO fileinfoblock
  675.     DEF    achain=NIL:PTR TO achain
  676.     DEF err=0,pathlen,filestart,first=0,chance=1
  677.     DEF    newdate=NIL:PTR TO datestamp
  678.     DEF apath=NIL:PTR TO anchorpath
  679.  
  680.   IF wbmessage<>NIL /* E provides us with WB's startup message in this variable */
  681.     wb:=wbmessage;args:=wb.arglist
  682.     olddir:=CurrentDir(args.lock)
  683.  
  684.     IF args.name>0
  685.       GetCurrentDirName(progname,500)
  686.       StrAdd(progname,args.name,ALL)
  687.       toolobject:=GetDiskObjectNew(progname)
  688.     ENDIF
  689.  
  690.     IF toolobject<>NIL  /* If we succeded in opening our program icon. */
  691.       IF s:=FindToolType(toolobject.tooltypes,'MAXIWIDTH')
  692.         StrToLong(s,{maxiwidth})
  693.       ENDIF
  694.       IF s:=FindToolType(toolobject.tooltypes,'MAXIHEIGHT')
  695.         StrToLong(s,{maxiheight})
  696.       ENDIF
  697.       IF s:=FindToolType(toolobject.tooltypes,'APPICON')
  698.         StrCopy(sleepername,s,ALL)
  699.       ENDIF
  700.             IF s:=FindToolType(toolobject.tooltypes,'NOAPPITEM')
  701.                 IF yup(s) THEN noappitem:=TRUE
  702.             ENDIF
  703.       IF s:=FindToolType(toolobject.tooltypes,'TEMPLATE_ICON')
  704.         StrCopy(templatename,s,ALL)
  705.       ENDIF
  706.       IF s:=FindToolType(toolobject.tooltypes,'BACKGROUND_ICON')
  707.         StrCopy(backname,s,ALL)
  708.       ENDIF
  709.       IF s:=FindToolType(toolobject.tooltypes,'CHUNKYMODE')
  710.                 chunkyflag:=yup(s)
  711.       ENDIF
  712.       IF s:=FindToolType(toolobject.tooltypes,'FORCE_EIGHT')
  713.         force8:=yup(s)
  714.       ENDIF
  715.       IF s:=FindToolType(toolobject.tooltypes,'CENTER')
  716.         centerflag:=yup(s)
  717.       ENDIF
  718.       IF s:=FindToolType(toolobject.tooltypes,'HIGHPEN')
  719.         StrToLong(s,{first4})
  720.       ENDIF
  721.       IF s:=FindToolType(toolobject.tooltypes,'FIRSTFOUR')
  722.         IF yup(s) THEN first4:=3
  723.       ENDIF
  724.       IF s:=FindToolType(toolobject.tooltypes,'FREE_ICON_POS')
  725.         freeme:=yup(s)
  726.       ENDIF
  727.       IF s:=FindToolType(toolobject.tooltypes,'PIC_X_POS')
  728.         StrToLong(s,{posx})
  729.       ENDIF
  730.       IF s:=FindToolType(toolobject.tooltypes,'PIC_Y_POS')
  731.         StrToLong(s,{posy})
  732.       ENDIF
  733.       IF s:=FindToolType(toolobject.tooltypes,'APP_X_POS')
  734.         StrToLong(s,{appx})
  735.       ENDIF
  736.       IF s:=FindToolType(toolobject.tooltypes,'APP_Y_POS')
  737.         StrToLong(s,{appy})
  738.       ENDIF
  739.       IF s:=FindToolType(toolobject.tooltypes,'PIC_X_SIZE')
  740.         StrToLong(s,{sizex})
  741.       ENDIF
  742.       IF s:=FindToolType(toolobject.tooltypes,'PIC_Y_SIZE')
  743.         StrToLong(s,{sizey})
  744.       ENDIF
  745.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_X')
  746.         StrToLong(s,{showx})
  747.         showflag:=TRUE
  748.       ENDIF
  749.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_Y')
  750.         StrToLong(s,{showy})
  751.         showflag:=TRUE
  752.       ENDIF
  753.       IF s:=FindToolType(toolobject.tooltypes,'ASPECT_X')
  754.         StrToLong(s,{aspectx})
  755.       ENDIF
  756.       IF s:=FindToolType(toolobject.tooltypes,'ASPECT_Y')
  757.         StrToLong(s,{aspecty})
  758.       ENDIF
  759.       IF s:=FindToolType(toolobject.tooltypes,'LOWPRI')
  760.         IF yup(s) THEN SetTaskPri(FindTask(0),-1)
  761.       ENDIF
  762.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_OUTLINE')
  763.         IF yup(s)
  764.           texttype:=TEXT_OUTLINE
  765.         ENDIF
  766.       ENDIF
  767.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_NORMAL')
  768.         IF yup(s)
  769.           texttype:=TEXT_NORMAL
  770.         ENDIF
  771.       ENDIF
  772.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_TALL')
  773.         IF yup(s)
  774.           tallfont:=TRUE
  775.         ENDIF
  776.       ENDIF
  777.       IF s:=FindToolType(toolobject.tooltypes,'QUIET')
  778.         IF yup(s)
  779.           quietflag:=TRUE
  780.                     mode:=MODE_QUIET
  781.         ENDIF
  782.       ENDIF
  783.       IF s:=FindToolType(toolobject.tooltypes,'DITHER')
  784.         IF nope(s)
  785.           dither:=FALSE
  786.         ENDIF
  787.       ENDIF
  788.       IF s:=FindToolType(toolobject.tooltypes,'NEWICON')
  789.         IF yup(s)
  790.                     IF (newiconbase)
  791.               newicon:=TRUE
  792.                     ENDIF
  793.         ENDIF
  794.       ENDIF
  795.     ENDIF
  796.     IF wb.numargs>1
  797.       totfile:=wb.numargs-1
  798.       curfile:=1
  799.             abort:=FALSE
  800.       FOR locs:=2 TO wb.numargs
  801.         olddir:=args[].lock++
  802.         IF args.lock
  803.           olddir:=CurrentDir(args.lock)
  804.           GetCurrentDirName(filename,250)
  805.           NameFromLock(args.lock,wstr,240)
  806.           CurrentDir(olddir)
  807.           processname(filename,wstr,args.name)
  808.           mode:=MODE_WB
  809.           enforcemax()
  810.           processicon()
  811.         ENDIF
  812.         curfile:=curfile+1
  813.                 IF CtrlC();locs:=50000;ENDIF
  814.                 IF (abort<>0);locs:=50000;ENDIF
  815.       ENDFOR
  816.     ELSE
  817.       mode:=MODE_APP
  818.       enforcemax()
  819.       dosleep()
  820.     ENDIF
  821.   ELSE
  822.     mode:=MODE_CLI
  823.     FOR scratch:=0 TO 39
  824.       argarray[scratch]:=NIL
  825.     ENDFOR
  826.     rdarg:=ReadArgs('FILE/A/M,TI=TEMPLATE/K,BI=BACKICON/K,MW=MAXIWIDTH/K/N,MH=MAXIHEIGHT/K/N,PX=PICXPOS/K/N,PY=PICYPOS/K/N,PW=PICXSIZE/K/N,PH=PICYSIZE/K/N,SSX=SHOWSIZEX/K/N,SSY=SHOWSIZEY/K/N,HP=HIGHPEN/K/N,NOD=NODITHER/S,C=CENTER/S,FF=FIRSTFOUR/S,FIP=FREEICONPOS/S,CM=CHUNKY/S,F8=FORCEEIGHT/S,SSOL=SHOWSIZEOUTLINE/S,SSN=SHOWSIZENORMAL/S,SST=SHOWSIZETALL/S,LP=LOWPRI/S,Q=QUIET/S,AX=ASPECTX/N,AY=ASPECTY/N,IA=IGNOREASPECT/S,NWI=NOWHATIS/S,NI=NEWICON/S',argarray,0)
  827.     IF rdarg
  828.       IF argarray[1]
  829.         StrCopy(templatename,argarray[1],ALL)
  830.         stripinfo(templatename)
  831.       ENDIF
  832.       IF argarray[2]
  833.         StrCopy(backname,argarray[2],ALL)
  834.         stripinfo(backname)
  835.       ENDIF
  836.       IF argarray[3]
  837.         maxiwidth:=argarray[3]
  838.         maxiwidth:=^maxiwidth
  839.       ENDIF
  840.       IF argarray[4]
  841.         maxiheight:=argarray[4]
  842.         maxiheight:=^maxiheight
  843.       ENDIF
  844.       IF argarray[5]
  845.         posx:=argarray[5]
  846.         posx:=^posx
  847.       ENDIF
  848.       IF argarray[6]
  849.         posy:=argarray[6]
  850.            posy:=^posy
  851.       ENDIF
  852.       IF argarray[7]
  853.         sizex:=argarray[7]
  854.         sizex:=^sizex
  855.       ENDIF
  856.       IF argarray[8]
  857.         sizey:=argarray[8]
  858.         sizey:=^sizey
  859.       ENDIF
  860.       IF argarray[9]
  861.         showx:=argarray[9]
  862.         showx:=^showx
  863.                 showflag:=TRUE
  864.       ENDIF
  865.       IF argarray[10]
  866.         showy:=argarray[10]
  867.         showy:=^showy
  868.                 showflag:=TRUE
  869.       ENDIF
  870.       IF argarray[11]
  871.         first4:=argarray[11]
  872.         first4:=^first4
  873.       ENDIF
  874.             IF argarray[12] THEN dither:=FALSE
  875.             IF argarray[13] THEN centerflag:=TRUE
  876.             IF argarray[14] THEN first4:=3
  877.             IF argarray[15] THEN freeme:=TRUE
  878.             IF argarray[16] THEN chunkyflag:=TRUE
  879.             IF argarray[17] THEN force8:=TRUE
  880.             IF argarray[18] THEN texttype:=TEXT_OUTLINE
  881.             IF argarray[19] THEN texttype:=TEXT_NORMAL
  882.             IF argarray[20] THEN tallfont:=TRUE
  883.             IF argarray[21] THEN SetTaskPri(FindTask(0),-1)
  884.             IF argarray[22];quietflag:=TRUE;mode:=MODE_QUIET;ENDIF
  885.       IF argarray[23]
  886.         aspectx:=argarray[23]
  887.         aspectx:=limit(^aspectx,1,100)
  888.       ENDIF
  889.       IF argarray[24]
  890.         aspecty:=argarray[24]
  891.         aspecty:=limit(^aspecty,1,100)
  892.       ENDIF
  893.             IF argarray[25] THEN useaspect:=FALSE
  894.             IF argarray[26] THEN usewhatis:=FALSE
  895.             IF argarray[27]
  896.                 IF (newiconbase)
  897.                     newicon:=TRUE
  898.                 ENDIF
  899.             ENDIF
  900.         enforcemax()
  901.       IF argarray[0]
  902.                 namesptr:=argarray[0]
  903.                 err:=NIL
  904.                 WHILE ((namesptr[0]) AND (err=NIL))
  905.                     StrCopy(patternstr,namesptr[0],ALL)
  906.                     apath:=New(SIZEOF anchorpath)
  907.                     first:=FALSE
  908.                     WHILE err=NIL
  909.                         IF first=FALSE
  910.                             err:=MatchFirst(patternstr,apath)
  911.                             first:=TRUE
  912.                         ELSE
  913.                             err:=MatchNext(apath)
  914.                         ENDIF
  915.                         IF err=NIL
  916.                             achain:=apath.last
  917.                             IF (achain)
  918.                                 fileinfo:=achain.info
  919.                                 IF (fileinfo)
  920.                                     IF (fileinfo.direntrytype<0)
  921.                                         filestart:=FilePart(patternstr)
  922.                                         pathlen:=filestart-patternstr
  923.                                         IF (pathlen)
  924.                                             StrCopy(filename,patternstr,pathlen)
  925.                                         ELSE
  926.                                             StrCopy(filename,'',ALL)
  927.                                         ENDIF
  928.                                         AddPart(filename,fileinfo.filename,490)
  929.                                         StrCopy(dumstr,filename,ALL)
  930.                                         UpperStr(dumstr)
  931.                                         IF (InStr(dumstr,'.INFO')<0)
  932.                                         processicon()
  933.                                         ENDIF
  934.                                     ENDIF
  935.                                 ENDIF
  936.                             ENDIF
  937.                         ENDIF
  938.                         IF CtrlC();err:=87;WriteF('***Break\n');ENDIF
  939.                     ENDWHILE
  940.                     MatchEnd(apath)
  941.                     Dispose(apath)
  942.                     namesptr:=namesptr+4
  943.                     IF err<>87 THEN err:=0
  944.                 ENDWHILE
  945.         StrCopy(filename,argarray[0],ALL)
  946.       ENDIF
  947.       FreeArgs(rdarg);rdarg:=NIL
  948.     ENDIF
  949.   ENDIF
  950. ENDPROC
  951. PROC enforcemax()
  952.     IF maxiwidth<32 THEN maxiwidth:=32
  953.     IF maxiwidth>1024 THEN maxiwidth:=1024
  954.     IF maxiheight<32 THEN maxiheight:=32
  955.     IF maxiheight>1024 THEN maxiheight:=1024
  956.         IF (newicon)
  957.             IF maxiwidth>92 THEN maxiwidth:=92
  958.             IF maxiheight>92 THEN maxiheight:=92
  959.         ENDIF
  960.     maxiw:=maxiwidth-1
  961.     maxih:=maxiheight-1
  962.     IF quietflag
  963.       mode:=MODE_QUIET
  964.     ENDIF
  965.     IF sizex>maxiw THEN sizex:=maxiw
  966.     IF sizey>maxih THEN sizey:=maxih
  967.     IF posx>=maxiw THEN posx:=maxiw-1
  968.     IF posy>=maxih THEN posy:=maxih-1
  969.     IF posx+sizex>maxiw THEN sizex:=maxiw-posx
  970.     IF posy+sizey>maxih THEN sizey:=maxih-posy
  971.     IF ((posx) OR (posy) OR (sizex) OR (sizey)) THEN posflag:=TRUE
  972.     IF sizex=0 THEN sizex:=maxiw-posx
  973.     IF sizey=0 THEN sizey:=maxih-posy
  974. ENDPROC
  975. PROC loadcatalog()
  976.   IF localebase
  977.     catalog:=OpenCatalogA(NIL,'picticon.catalog',[OC_BUILTINLANGUAGE,'english',NIL,NIL])
  978.   ENDIF
  979.   readstrings()
  980.   FOR scratch:=0 TO L_ENDS
  981.     sl[scratch]:=locale(scratch)
  982.   ENDFOR
  983. ENDPROC
  984. PROC locale(strnum)
  985.   DEF stpoint,defstr
  986.   defstr:=sl[strnum]
  987.   IF ((localebase) AND (catalog))
  988.     stpoint:=GetCatalogStr(catalog,strnum,defstr)
  989.   ELSE
  990.     stpoint:=defstr
  991.   ENDIF
  992. ENDPROC stpoint
  993. PROC readstrings()
  994.   DEF buf,res=0
  995.   buf:={catstrs}
  996.   WHILE(Int(buf))<>0
  997.     res:=res+1
  998.     IF res>0 AND res<300
  999.       sl[res]:=buf
  1000.     ENDIF
  1001.     WHILE Char(buf)<>"¶"
  1002.       buf:=buf+1
  1003.     ENDWHILE
  1004.     PutChar(buf,0)
  1005.     buf:=buf+1
  1006.     buf:=(Mul(Div((buf+1),2),2))
  1007.   ENDWHILE
  1008. ENDPROC
  1009. PROC savewinpos() HANDLE
  1010.   DEF buffer=NIL,fhand=0
  1011.  
  1012.     IF ((mode=MODE_CLI) OR (mode=MODE_QUIET)) THEN RETURN
  1013.  
  1014.   iff:=AllocIFF()
  1015.     IF (iff)
  1016.         fhand:=Open('ENV:Picticon.prefs',MODE_NEWFILE)
  1017.         iff.stream:=fhand
  1018.       IF (iff.stream)=NIL THEN Raise(E_NONE)
  1019.       InitIFFasDOS(iff)
  1020.       buffer:=New(100)
  1021.       ierror:=OpenIFF(iff,IFFF_WRITE)
  1022.       IF ierror THEN Raise(E_NONE)
  1023.         PushChunk(iff,"PREF","FORM",IFFSIZE_UNKNOWN)
  1024.         PushChunk(iff,"PREF","PRHD",IFFSIZE_UNKNOWN)
  1025.       PutLong(buffer,0);PutLong(buffer+2,0)
  1026.         WriteChunkBytes(iff,buffer,6)
  1027.        PopChunk(iff)
  1028.  
  1029.        PushChunk(iff,"PREF","WIND",IFFSIZE_UNKNOWN)
  1030.         dumb:=buffer
  1031.         PutLong(dumb,winx);PutLong(dumb+4,winy)
  1032.         WriteChunkBytes(iff,buffer,8)
  1033.        PopChunk(iff)
  1034.       PopChunk(iff)
  1035.     ENDIF
  1036.   Raise(E_NONE)
  1037. EXCEPT
  1038.   IF buffer THEN Dispose(buffer);buffer:=NIL
  1039.   freeiff(666)
  1040.   handleexception(exception)
  1041. ENDPROC
  1042. PROC loadwinpos() HANDLE
  1043.   DEF buffer=NIL
  1044.  
  1045.   iff:=AllocIFF()
  1046.   iff.stream:=Open('ENV:Picticon.prefs',MODE_OLDFILE)
  1047.   IF (iff.stream)=NIL THEN Raise(E_NONE)
  1048.   InitIFFasDOS(iff)
  1049.   buffer:=New(100)
  1050.   ierror:=OpenIFF(iff,IFFF_READ)
  1051.   IF ierror THEN Raise(E_NONE)
  1052.   ierror:=PropChunk(iff,"PREF","WIND")
  1053.   ierror:=StopOnExit(iff,"PREF","FORM")
  1054.   ierror:=ParseIFF(iff,IFFPARSE_SCAN)
  1055.  
  1056.   IF (sp:=FindProp(iff,"PREF","WIND"))
  1057.     dumb:=sp.data
  1058.     winx:=Long(dumb);winy:=Long(dumb+4)
  1059.   ENDIF
  1060.  
  1061.   Raise(E_NONE)
  1062. EXCEPT
  1063.   IF buffer THEN Dispose(buffer)
  1064.   freeiff(666)
  1065.   handleexception(exception)
  1066. ENDPROC
  1067. PROC freeiff(unit)
  1068.   IF iff
  1069.     CloseIFF(iff)
  1070.     IF (iff.stream) THEN Close(iff.stream)
  1071.     FreeIFF(iff)
  1072.     iff:=NIL
  1073.   ENDIF
  1074. ENDPROC
  1075. PROC openlibs()
  1076.   IF (aslbase:=OpenLibrary('asl.library', 36))=NIL THEN CleanUp(25)
  1077.   localebase:=OpenLibrary('locale.library',37)
  1078.   loadcatalog()
  1079.   mathbase:=safeopenlibrary('mathffp.library',39)
  1080.   datatypesbase:=safeopenlibrary('datatypes.library',39)
  1081.   mathtransbase:=safeopenlibrary('mathtrans.library',36)
  1082.   gadtoolsbase:=safeopenlibrary('gadtools.library',36)
  1083.   workbenchbase:=safeopenlibrary('workbench.library',36)
  1084.   iconbase:=safeopenlibrary('icon.library', 36)
  1085.   iffparsebase:=safeopenlibrary('iffparse.library',36)
  1086.   diskfontbase:=safeopenlibrary('diskfont.library', 36)
  1087.   whatisbase:=OpenLibrary('whatis.library', 3);IF whatisbase=0 THEN usewhatis:=0
  1088.   newiconbase:=OpenLibrary('newicon.library', 37)
  1089.   IF KickVersion(39);osversion:=TRUE;ELSE;osversion:=FALSE;ENDIF
  1090. ENDPROC
  1091. PROC safeopenlibrary(name,vers) HANDLE
  1092.   DEF lret
  1093.   IF ((lret:=OpenLibrary(name,vers))=NIL) THEN Raise(L_EF_LIBRARY)
  1094.   Raise(E_NONE)
  1095. EXCEPT
  1096.   handleexception(exception)
  1097. ENDPROC lret
  1098. PROC handleexception(except)
  1099.   IF except<>E_NONE THEN errormessage(except)
  1100.   IF quitter THEN leave(quitter)
  1101. ENDPROC
  1102. PROC closelibs()
  1103.     IF whatisbase THEN CloseLibrary(whatisbase)
  1104.   IF newiconbase THEN CloseLibrary(newiconbase)
  1105.   IF diskfontbase THEN CloseLibrary(diskfontbase)
  1106.   IF aslbase THEN CloseLibrary(aslbase)
  1107.   IF iffparsebase THEN CloseLibrary(iffparsebase)
  1108.   IF iconbase THEN CloseLibrary(iconbase)
  1109.   IF workbenchbase THEN CloseLibrary(workbenchbase)
  1110.   IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  1111.   IF datatypesbase THEN CloseLibrary(datatypesbase)
  1112.   IF layersbase THEN CloseLibrary(layersbase)
  1113.   IF keymapbase THEN CloseLibrary(keymapbase)
  1114.   IF mathbase THEN CloseLibrary(mathbase)
  1115.   IF mathtransbase THEN CloseLibrary(mathtransbase)
  1116.   IF localebase THEN CloseLibrary(localebase)
  1117. ENDPROC
  1118. PROC errormessage(errnum)
  1119.   IF errnum>=L_EF_FATAL
  1120.     errmsg(sl[errnum])
  1121.     quitter:=TRUE
  1122.   ELSE
  1123.     IF errnum>=L_E_GENERAL
  1124.       errmsg(sl[errnum])
  1125.     ELSE
  1126.       errmsg(sl[L_E_GENERAL])
  1127.     ENDIF
  1128.   ENDIF
  1129. ENDPROC
  1130. PROC errmsg(msgptr)
  1131.   IF mode=MODE_CLI
  1132.     WriteF('\s\n\n',msgptr)
  1133.   ELSE
  1134.     IF ((mode=MODE_WB) OR (mode=MODE_APP))
  1135.       displaymessage(msgptr,TRUE)
  1136.       Delay(80)
  1137.     ENDIF
  1138.   ENDIF
  1139. ENDPROC
  1140. PROC sp_div_tf_tf_f(int1,int2)
  1141.   RETURN SpDiv(SpFlt(int1),SpFlt(int2))
  1142. ENDPROC
  1143. PROC leave(flag)
  1144.   IF catalog THEN CloseCatalog(catalog)
  1145.   IF appimagedata THEN FreeMem(appimagedata,3200);appimagedata:=NIL
  1146.   IF curbitmap THEN myfreebitmap(curbitmap);curbitmap:=NIL
  1147.     IF newicon
  1148.         IF newdiskobj THEN FreeNewDiskObject(newdiskobj);newdiskobj:=NIL;diskobj:=NIL
  1149.     ELSE
  1150.       IF diskobj THEN FreeDiskObject(diskobj);diskobj:=NIL
  1151.     ENDIF
  1152.   IF visual THEN FreeVisualInfo(visual);visual:=NIL
  1153.   IF toolobject THEN FreeDiskObject(toolobject);toolobject:=NIL
  1154.  
  1155.   closelibs()
  1156.     END iinfo
  1157.  
  1158.   IF flag
  1159.     IF flag=TRUE
  1160.       CleanUp(0)
  1161.     ELSE
  1162.       CleanUp(flag)
  1163.     ENDIF
  1164.   ENDIF
  1165. ENDPROC
  1166.  
  1167. PROC myallocbitmap(w,h,d,type,tags)
  1168.   IF osversion=TRUE
  1169.     RETURN AllocBitMap(w,h,d,type,tags)
  1170.   ENDIF
  1171. ENDPROC
  1172.  
  1173. PROC myfreebitmap(bm)
  1174.   IF osversion=TRUE
  1175.     RETURN FreeBitMap(bm)
  1176.   ELSE
  1177.   ENDIF
  1178. ENDPROC
  1179.  
  1180. PROC findcolor(colap,ared,agrn,ablu)
  1181.   DEF pointred,pointgrn,pointblu,mpen
  1182.   mpen:=-1
  1183.   IF (first4>0) THEN mpen:=first4
  1184.   pointred:=Shl(Shl(Shl(ared,8),8),8)
  1185.   pointgrn:=Shl(Shl(Shl(agrn,8),8),8)
  1186.   pointblu:=Shl(Shl(Shl(ablu,8),8),8)
  1187.   RETURN FindColor(colap,pointred,pointgrn,pointblu,mpen)
  1188. ENDPROC
  1189.  
  1190. /*PROC mygetrgb32(colmap,first,ncolors,table)
  1191.   DEF rre,eee
  1192.   IF osversion=TRUE
  1193.     GetRGB32(colmap,first,ncolors,table)
  1194.   ELSE
  1195.     rre:=GetRGB4(colmap,first)
  1196.     eee:=(rre AND $F)
  1197.     PutChar(table,eee)
  1198.     PutChar(table+1,eee)
  1199.     PutChar(table+2,eee)
  1200.     PutChar(table+3,eee)
  1201.     eee:=Shr((rre AND $F0),4)
  1202.     PutChar(table+4,eee)
  1203.     PutChar(table+5,eee)
  1204.     PutChar(table+6,eee)
  1205.     PutChar(table+7,eee)
  1206.     eee:=Shr((rre AND $F00),8)
  1207.     PutChar(table+8,eee)
  1208.     PutChar(table+9,eee)
  1209.     PutChar(table+10,eee)
  1210.     PutChar(table+11,eee)
  1211.   ENDIF
  1212. ENDPROC*/
  1213. PROC processname(name,dir,file)
  1214.  
  1215.   DEF wish[20]:STRING
  1216.  
  1217.   StrCopy(name,dir,ALL)
  1218.   IF StrLen(file)            /* IF a file (NOT DISK/DRAWER) */
  1219.     RightStr(wish,name,1)
  1220.     IF StrCmp(wish,':',1)=NIL       /*  DISK:DIR/NAME */
  1221.       StrAdd(name,'/',ALL)
  1222.     ENDIF
  1223.     StrAdd(name,file,ALL)
  1224.   ELSE
  1225.     RightStr(wish,name,1)
  1226.     IF StrCmp(wish,':',1)        /* DISK:  (so add disk) */
  1227.       StrAdd(name,'disk',ALL)
  1228.     ENDIF
  1229.     IF StrCmp(wish,'/',1)        /* DISK:DIR/DIR/  (delete '/' */
  1230.       MidStr(name,name,0,StrLen(name)-1)
  1231.     ENDIF
  1232.   ENDIF
  1233.   MidStr(wish,name,0,1)
  1234.   IF StrCmp(wish,'/',1)
  1235.     MidStr(name,name,1,ALL)
  1236.   ENDIF
  1237.   stripinfo(name)
  1238. ENDPROC
  1239. PROC stripinfo(name)
  1240.   DEF comp1[6]:STRING,comp2[6]:STRING
  1241.  
  1242.   StrCopy(comp1,'.INFO',ALL)
  1243.   MidStr(comp2,name,StrLen(name)-5,5)
  1244.   UpperStr(comp2)
  1245.   IF StrCmp(comp1,comp2,5)
  1246.     MidStr(name,name,0,(StrLen(name)-5))
  1247.   ENDIF
  1248. ENDPROC
  1249. /*PROC grabrgbtables()
  1250.   DEF cmtable
  1251.   cmtable:=[0,0,0,0,0,0]:LONG
  1252.   FOR scratch:=0 TO Shl(1,depth)-1
  1253.     mygetrgb32(newcolormap,scratch,1,cmtable)
  1254.     redt[scratch]:=Char(cmtable)
  1255.     grnt[scratch]:=Char(cmtable+4)
  1256.     blut[scratch]:=Char(cmtable+8)
  1257.   ENDFOR
  1258. ENDPROC
  1259. */
  1260. PROC stripselect(flags)
  1261.   IF (flags AND GFLG_GADGHIMAGE) THEN flags:=flags-GFLG_GADGHIMAGE
  1262.   IF (flags AND GFLG_GADGHCOMP) THEN flags:=flags-GFLG_GADGHCOMP
  1263.   IF (flags AND GADGBACKFILL) THEN flags:=flags-GADGBACKFILL
  1264. ENDPROC flags
  1265.  
  1266.  
  1267. PROC copybitmap2image(sb,di,nb,ys,dp,savedepth)
  1268.  
  1269.   DEF plane,cp,cr,cb,byte,sbs=NIL:PTR TO mybitmapstruct
  1270.  
  1271.   sbs:=sb;byte:=di
  1272.   FOR plane:=1 TO savedepth
  1273.     IF plane>dp         /* If save plane is not edited, use highest that was */
  1274.       SELECT dp
  1275.         CASE 1;cp:=sbs.plane1
  1276.         CASE 2;cp:=sbs.plane2
  1277.         CASE 3;cp:=sbs.plane3
  1278.         CASE 4;cp:=sbs.plane4
  1279.         CASE 5;cp:=sbs.plane5
  1280.         CASE 6;cp:=sbs.plane6
  1281.         CASE 7;cp:=sbs.plane7
  1282.         CASE 8;cp:=sbs.plane8
  1283.       ENDSELECT
  1284.     ELSE
  1285.       SELECT plane
  1286.         CASE 1;cp:=sbs.plane1
  1287.         CASE 2;cp:=sbs.plane2
  1288.         CASE 3;cp:=sbs.plane3
  1289.         CASE 4;cp:=sbs.plane4
  1290.         CASE 5;cp:=sbs.plane5
  1291.         CASE 6;cp:=sbs.plane6
  1292.         CASE 7;cp:=sbs.plane7
  1293.         CASE 8;cp:=sbs.plane8
  1294.       ENDSELECT
  1295.     ENDIF
  1296.     FOR cr:=0 TO ys-1
  1297.       FOR cb:=0 TO nb-1
  1298.         MOVE.L byte,A0
  1299.         MOVE.L cp,A1
  1300.         MOVE.B (A1),(A0)
  1301.         byte:=byte+1;cp:=cp+1
  1302.       ENDFOR
  1303.       cp:=cp+(sbs.bytesperrow-nb)
  1304.     ENDFOR
  1305.   ENDFOR
  1306. ENDPROC
  1307.  
  1308. PROC copyrast2image(sb,di,nb,ys,dp,savedepth)
  1309.  
  1310.   DEF plane,cp,cr,cb,byte,sbs=NIL:PTR TO mybitmapstruct
  1311.  
  1312.   byte:=di
  1313.   FOR plane:=0 TO savedepth-1
  1314.     ditz:=Shl(1,smaller(plane,dp))
  1315.     FOR cr:=0 TO ys-1
  1316.       FOR cb:=0 TO nb-1
  1317.         body:=0
  1318.         FOR dang:=7 TO 0 STEP -1
  1319.           dumb:=ReadPixel(sb,(cb*8)+(7-dang),cr)
  1320.           IF (dumb AND ditz) THEN body:=(body OR Shl(1,dang))
  1321.         ENDFOR
  1322.         PutChar(byte,body)
  1323.         byte:=byte+1
  1324.       ENDFOR
  1325.     ENDFOR
  1326.   ENDFOR
  1327. ENDPROC
  1328.  
  1329. PROC findsize(rast1)
  1330.   DEF li,lt,a
  1331.   requestsizex:=NIL;requestsizey:=NIL
  1332.   FOR li:=0 TO maxih;FOR lt:=0 TO maxiw
  1333.       a:=ReadPixel(rast1,lt,li)
  1334.       IF (a)
  1335.         IF lt>requestsizex;requestsizex:=lt;ENDIF
  1336.         IF li>requestsizey;requestsizey:=li;ENDIF
  1337.       ENDIF
  1338.       IF a>highestcolor;highestcolor:=a;ENDIF
  1339.     ENDFOR;ENDFOR
  1340.   requestsizex:=requestsizex+1;requestsizey:=requestsizey+2
  1341. ENDPROC
  1342.  
  1343. PROC restorediskobj(diskobj:PTR TO diskobject)
  1344.   DEF gadget:PTR TO gadget
  1345.   gadget:=diskobj.gadget
  1346.   gadget.gadgetrender:=k[0]
  1347.   gadget.selectrender:=k[1]
  1348.   gadget.flags:=k[2]
  1349.   diskobj.drawerdata:=k[3]
  1350.   Dispose(k[4]);k[4]:=NIL
  1351.   Dispose(k[5]);k[5]:=NIL
  1352.   Dispose(k[6]);k[6]:=NIL
  1353.   diskobj.type:=k[7]
  1354.   IF k[9]  THEN FreeMem(k[9], k[8])
  1355.   IF k[10] THEN FreeMem(k[10],k[8])
  1356.   k[9]:=NIL
  1357.   k[10]:=NIL
  1358. ENDPROC
  1359.  
  1360. PROC creatediskobj(diskobj:PTR TO diskobject,rast1:PTR TO rastport) HANDLE
  1361.   DEF gadget:PTR TO gadget
  1362.   DEF iconsizex,iconsizey,highplane
  1363.   DEF numbyteswide,savedepthhow,sizetmp
  1364.   DEF i1:PTR TO image,i2:PTR TO image
  1365.   DEF bitm1
  1366.  
  1367.   gadget:=diskobj.gadget
  1368.   k[0]:=gadget.gadgetrender
  1369.   k[1]:=gadget.selectrender
  1370.   k[2]:=gadget.flags
  1371.   k[3]:=diskobj.drawerdata
  1372.   k[4]:=New(SIZEOF image)
  1373.   k[5]:=New(SIZEOF image)
  1374.   k[6]:=New(SIZEOF drawerdata)
  1375.   k[7]:=diskobj.type
  1376.   k[8]:=0
  1377.   k[9]:=0
  1378.   highestcolor:=0
  1379.   bitm1:=curbitmap
  1380.  
  1381.   findsize(rast1)
  1382.   iconsizex:=bigger(bigger(requestsizex,10),minimumx)
  1383.   iconsizey:=bigger(bigger(requestsizey,10),minimumy)
  1384.  
  1385.   numbyteswide:=((iconsizex+15)/16)*2
  1386.   savedepthhow:=depth
  1387.   IF (force8) THEN savedepthhow:=8
  1388.   sizetmp:=(numbyteswide*iconsizey*savedepthhow)+1000
  1389.  
  1390.   k[8]:=sizetmp
  1391.   k[9]:=AllocMem(sizetmp,(MEMF_CHIP OR MEMF_CLEAR))
  1392.   k[10]:=AllocMem(sizetmp,(MEMF_CHIP OR MEMF_CLEAR))
  1393.   IF ((k[9]=NIL) OR (k[10]=NIL)) THEN Raise(L_EF_CHIPBUFFER)
  1394.  
  1395.   IF chunkyflag=NIL
  1396.     copybitmap2image(bitm1,k[9],numbyteswide,iconsizey-1,depth,savedepthhow)
  1397.   ELSE
  1398.     copyrast2image(rast1,k[9],numbyteswide,iconsizey-1,depth,savedepthhow)
  1399.   ENDIF
  1400.   i1:=k[4];i2:=k[5]
  1401.   i1.leftedge:=0;i1.topedge:=0;i1.width:=iconsizex
  1402.   i1.height:=iconsizey-1;i1.depth:=8;i1.imagedata:=k[9]
  1403.   i1.planepick:=0;i1.planeonoff:=0;i1.nextimage:=NIL
  1404.   i2.leftedge:=0;i2.topedge:=0;i2.width:=iconsizex
  1405.   i2.height:=iconsizey-1;i2.depth:=8;i2.imagedata:=k[10]
  1406.   i2.planepick:=0;i2.planeonoff:=0;i2.nextimage:=NIL
  1407.  
  1408.   highplane:=1
  1409.   IF highestcolor>1;highplane:=2;ENDIF
  1410.   IF highestcolor>3;highplane:=3;ENDIF
  1411.   IF highestcolor>7;highplane:=4;ENDIF
  1412.   IF highestcolor>15;highplane:=5;ENDIF
  1413.   IF highestcolor>31;highplane:=6;ENDIF
  1414.   IF highestcolor>63;highplane:=7;ENDIF
  1415.   IF highestcolor>127;highplane:=8;ENDIF
  1416.   IF (force8)
  1417.     i1.depth:=8
  1418.     i2.depth:=8
  1419.   ELSE
  1420.     i1.depth:=highplane
  1421.     i2.depth:=highplane
  1422.   ENDIF
  1423.   gadget.width:=iconsizex;gadget.height:=iconsizey;gadget.gadgetrender:=i1
  1424.   gadget.selectrender:=NIL
  1425.   IF freeme=TRUE
  1426.     diskobj.currentx:=NO_ICON_POSITION
  1427.     diskobj.currenty:=NO_ICON_POSITION
  1428.   ENDIF
  1429.   gadget.flags:=stripselect(gadget.flags)
  1430.   gadget.flags:=(gadget.flags OR GFLG_GADGHCOMP)
  1431.   diskobj.type:=WBPROJECT
  1432.  
  1433.   Raise(E_NONE)
  1434. EXCEPT
  1435.   IF exception<>E_NONE
  1436.     errormessage(exception)
  1437.   ENDIF
  1438.   IF quitter THEN leave(quitter)
  1439. ENDPROC
  1440.  
  1441. PROC yup(s) IS (MatchToolValue(s,{yes}) OR MatchToolValue(s,{true}))
  1442. PROC nope(s) IS (MatchToolValue(s,{no}) OR MatchToolValue(s,{false}))
  1443. PROC threshold(val,th);IF Abs(val)<=th THEN RETURN 0;ENDPROC val
  1444.  
  1445. PROC domethod( obj:PTR TO object, msg:PTR TO msg )
  1446.   DEF h:PTR TO hook, o:PTR TO object, dispatcher
  1447.   IF obj
  1448.     o := obj-SIZEOF object     /* instance data is to negative offset */
  1449.     h := o.class
  1450.     dispatcher := h.entry      /* get dispatcher from hook in iclass */
  1451.     MOVEA.L h,A0
  1452.     MOVEA.L msg,A1
  1453.     MOVEA.L obj,A2           /* probably should use CallHookPkt, but the */
  1454.     MOVEA.L dispatcher,A3    /*   original code (DoMethodA()) doesn't. */
  1455.     JSR (A3)                 /* call classDispatcher() */
  1456.     MOVE.L D0,o
  1457.     RETURN o
  1458.   ENDIF
  1459. ENDPROC NIL
  1460.  
  1461. PROC copyimagerast(rastp:PTR TO rastport,image)
  1462.   DrawImage(rastp,image,0,0)
  1463. ENDPROC
  1464.  
  1465. catstrs:
  1466.   CHAR 'Ok¶'
  1467.   CHAR 'Error: A general error has occured.¶'
  1468.   CHAR 'Error: File not found.¶'
  1469.   CHAR 'Error: Could not open file.¶'
  1470.   CHAR 'Error: Problems with icon.¶'
  1471.   CHAR 'Error: Unable to write icon file.¶'
  1472.   CHAR 'Error: Problems opening clipboard.¶'
  1473.   CHAR 'Error: Problems with datatype.¶'
  1474.   CHAR 'Error: Datatype is not a picture.¶'
  1475.   CHAR 'Error: Problems creating gadgets.¶'
  1476.   CHAR 'Error: Could not open a required library.¶'
  1477.   CHAR 'Error: An undefined FATAL error has occured.¶'
  1478.   CHAR 'Fatal Error: Could not lock a public screen.¶'
  1479.   CHAR 'Fatal Error: Not enough CHIP memory\n        for a required buffer.¶'
  1480.   CHAR 'Fatal Error: Could not obtain a visual lock.¶'
  1481.   CHAR 'Fatal Error: Unable to create menus.¶'
  1482.   CHAR 'Fatal Error: Could not open a port.¶'
  1483.   CHAR 'Fatal Error: Unable to open window.¶'
  1484.   CHAR 'Error: Unable to allocate some memory.¶'
  1485.   CHAR 'Picticon Status¶'
  1486.   CHAR 'Picture "\s"¶'
  1487.   CHAR '(\d of \d)¶'
  1488.   CHAR 'Loading...¶'
  1489.   CHAR '*¶'
  1490.   CHAR '*¶'
  1491.   CHAR 'Saving icon.¶'
  1492.   CHAR '*¶'
  1493.   CHAR 'Picticon¶'
  1494.   CHAR 'Copyright ©1993,94\n by Chad Randall\n\nThis software is freely re-distributable.\n\nDo you wish to quit?¶'
  1495.   CHAR 'Quit|Cancel¶'
  1496.   CHAR 'Rendering...¶'
  1497.   CHAR '(\d%% done.)¶'
  1498.   LONG 0,0,0
  1499.  
  1500. chardata:
  1501.  
  1502.   CHAR '.xxx...'
  1503.   CHAR 'x...x..'
  1504.   CHAR 'x...x..'
  1505.   CHAR 'x...x..'
  1506.   CHAR 'x...x..'
  1507.   CHAR '.xxx...'
  1508.  
  1509.   CHAR '..x....'
  1510.   CHAR '..x....'
  1511.   CHAR '..x....'
  1512.   CHAR '..x....'
  1513.   CHAR '..x....'
  1514.   CHAR '..x....'
  1515.  
  1516.   CHAR 'xxxxx..'
  1517.   CHAR '....x..'
  1518.   CHAR '..xxx..'
  1519.   CHAR '.x.....'
  1520.   CHAR 'x......'
  1521.   CHAR 'xxxxx..'
  1522.  
  1523.   CHAR 'xxxx...'
  1524.   CHAR '....x..'
  1525.   CHAR '..xx...'
  1526.   CHAR '....x..'
  1527.   CHAR '....x..'
  1528.   CHAR 'xxxx...'
  1529.  
  1530.   CHAR '...x...'
  1531.   CHAR '..xx...'
  1532.   CHAR '.x.x...'
  1533.   CHAR 'xxxxx..'
  1534.   CHAR '...x...'
  1535.   CHAR '...x...'
  1536.  
  1537.   CHAR 'xxxxx..'
  1538.   CHAR 'x......'
  1539.   CHAR 'xxxx...'
  1540.   CHAR '....x..'
  1541.   CHAR '....x..'
  1542.   CHAR 'xxxx...'
  1543.  
  1544.   CHAR '.xxx...'
  1545.   CHAR 'x......'
  1546.   CHAR 'xxxx...'
  1547.   CHAR 'x...x..'
  1548.   CHAR 'x...x..'
  1549.   CHAR '.xxx...'
  1550.  
  1551.   CHAR 'xxxxx..'
  1552.   CHAR '....x..'
  1553.   CHAR '...x...'
  1554.   CHAR '..x....'
  1555.   CHAR '..x....'
  1556.   CHAR '..x....'
  1557.  
  1558.   CHAR '.xxx...'
  1559.   CHAR 'x...x..'
  1560.   CHAR '.xxx...'
  1561.   CHAR 'x...x..'
  1562.   CHAR 'x...x..'
  1563.   CHAR '.xxx...'
  1564.  
  1565.   CHAR '.xxx...'
  1566.   CHAR 'x...x..'
  1567.   CHAR '.xxxx..'
  1568.   CHAR '....x..'
  1569.   CHAR '....x..'
  1570.   CHAR '.xxx...'
  1571.  
  1572. xdata:
  1573.   CHAR '.......'
  1574.   CHAR '.......'
  1575.   CHAR '.x.x...'
  1576.   CHAR '..x....'
  1577.   CHAR '.x.x...'
  1578.   CHAR '.......'
  1579.  
  1580. chardatal:
  1581.  
  1582.   CHAR '.xxx...'
  1583.   CHAR 'x...x..'
  1584.   CHAR 'x...x..'
  1585.   CHAR 'x...x..'
  1586.   CHAR 'x...x..'
  1587.   CHAR 'x...x..'
  1588.   CHAR 'x...x..'
  1589.   CHAR '.xxx...'
  1590.  
  1591.   CHAR '..x....'
  1592.   CHAR '..x....'
  1593.   CHAR '..x....'
  1594.   CHAR '..x....'
  1595.   CHAR '..x....'
  1596.   CHAR '..x....'
  1597.   CHAR '..x....'
  1598.   CHAR '..x....'
  1599.  
  1600.   CHAR '.xxx...'
  1601.   CHAR 'x...x..'
  1602.   CHAR '....x..'
  1603.   CHAR '...x...'
  1604.   CHAR '..x....'
  1605.   CHAR '.x.....'
  1606.   CHAR 'x......'
  1607.   CHAR 'xxxxx..'
  1608.  
  1609.   CHAR '.xxx...'
  1610.   CHAR 'x...x..'
  1611.   CHAR '....x..'
  1612.   CHAR '..xx...'
  1613.   CHAR '....x..'
  1614.   CHAR '....x..'
  1615.   CHAR 'x...x..'
  1616.   CHAR '.xxx...'
  1617.  
  1618.   CHAR '...x...'
  1619.   CHAR '..xx...'
  1620.   CHAR '.x.x...'
  1621.   CHAR 'x..x...'
  1622.   CHAR 'xxxxx..'
  1623.   CHAR '...x...'
  1624.   CHAR '...x...'
  1625.   CHAR '...x...'
  1626.  
  1627.   CHAR 'xxxxx..'
  1628.   CHAR 'x......'
  1629.   CHAR 'x......'
  1630.   CHAR 'xxxx...'
  1631.   CHAR '....x..'
  1632.   CHAR '....x..'
  1633.   CHAR '....x..'
  1634.   CHAR 'xxxx...'
  1635.  
  1636.   CHAR '.xxx...'
  1637.   CHAR 'x......'
  1638.   CHAR 'x......'
  1639.   CHAR 'xxxx...'
  1640.   CHAR 'x...x..'
  1641.   CHAR 'x...x..'
  1642.   CHAR 'x...x..'
  1643.   CHAR '.xxx...'
  1644.  
  1645.   CHAR 'xxxxx..'
  1646.   CHAR '....x..'
  1647.   CHAR '....x..'
  1648.   CHAR '...x...'
  1649.   CHAR '..x....'
  1650.   CHAR '..x....'
  1651.   CHAR '..x....'
  1652.   CHAR '..x....'
  1653.  
  1654.   CHAR '.xxx...'
  1655.   CHAR 'x...x..'
  1656.   CHAR 'x...x..'
  1657.   CHAR '.xxx...'
  1658.   CHAR 'x...x..'
  1659.   CHAR 'x...x..'
  1660.   CHAR 'x...x..'
  1661.   CHAR '.xxx...'
  1662.  
  1663.   CHAR '.xxx...'
  1664.   CHAR 'x...x..'
  1665.   CHAR 'x...x..'
  1666.   CHAR '.xxxx..'
  1667.   CHAR '....x..'
  1668.   CHAR '....x..'
  1669.   CHAR 'x...x..'
  1670.   CHAR '.xxx...'
  1671.  
  1672. xdatal:
  1673.   CHAR '.......'
  1674.   CHAR '.......'
  1675.   CHAR 'x...x..'
  1676.   CHAR '.x.x...'
  1677.   CHAR '..x....'
  1678.   CHAR '.x.x...'
  1679.   CHAR 'x...x..'
  1680.   CHAR '.......'
  1681.  
  1682. controlstring:
  1683.   CHAR 10,$B,0,0,0,0
  1684.   CHAR $9B,"1",$53,$0,$0,$0,$0
  1685.  
  1686.